SQL 인덱스 관리

IT 위키

SQL 인덱스 관리(SQL Index Management, 索引管理)은 관계형 데이터베이스에서 인덱스를 생성, 유지, 최적화하여 질의 성능을 향상시키는 작업을 의미한다.

1 개요[편집 | 원본 편집]

인덱스는 데이터베이스 테이블에서 특정 컬럼의 값을 기반으로 검색 속도를 향상시키기 위한 자료 구조이다. 인덱스를 적절히 관리하면 데이터 검색 시간이 대폭 단축되며, 부적절한 인덱스는 오히려 성능 저하의 원인이 될 수 있다.

2 인덱스의 종류[편집 | 원본 편집]

  • 기본 인덱스(Primary Index)
  • 보조 인덱스(Secondary Index)
  • 고유 인덱스(Unique Index)
  • 복합 인덱스(Composite Index)
  • 함수 기반 인덱스(Function-based Index)
  • 비트맵 인덱스(Bitmap Index)

3 인덱스 생성[편집 | 원본 편집]

인덱스는 일반적으로 CREATE INDEX 문을 사용하여 생성하며, 다음과 같은 방식으로 정의할 수 있다.

CREATE INDEX idx_employee_name ON employees(name);

복합 인덱스는 다음과 같이 생성할 수 있다.

CREATE INDEX idx_employee_dept_salary ON employees(department_id, salary);

고유 인덱스는 중복값을 허용하지 않는 인덱스로 다음과 같이 생성한다.

CREATE UNIQUE INDEX idx_employee_email ON employees(email);

4 인덱스 관리 전략[편집 | 원본 편집]

  • 사용률 분석: 잘 사용되지 않는 인덱스는 제거하여 저장 공간을 절약하고 DML 성능을 향상시킨다.
  • 정기적 재구성(Rebuild): 데이터 변경이 많을 경우 인덱스의 조각화(fragmentation)를 줄이기 위해 재구성이 필요하다.
  • 통계 정보 갱신: 옵티마이저가 최적의 실행 계획을 수립할 수 있도록 주기적으로 인덱스 통계 정보를 갱신한다.
  • 자동 인덱스 관리: 일부 DBMS는 자동으로 인덱스를 생성·제거하는 기능을 제공한다(예: Oracle의 Automatic Indexing).
  • 인덱스 조건 최적화: WHERE 절과 자주 결합되는 컬럼 중심으로 인덱스를 구성한다.

5 인덱스 사용 모니터링[편집 | 원본 편집]

  • 실행 계획(EXPLAIN 또는 EXPLAIN PLAN)을 통해 쿼리가 인덱스를 사용하는지 확인 가능
 예:
 EXPLAIN SELECT * FROM employees WHERE name = '김철수';
  • 쿼리 성능 도구(SQL Server Profiler, Oracle AWR 등)로 인덱스 활용도 측정
  • DMVs(Dynamic Management Views)나 시스템 뷰를 통해 인덱스 통계 확인
 예:
 SELECT * FROM sys.dm_db_index_usage_stats WHERE object_id = OBJECT_ID('employees');

6 인덱스 제거[편집 | 원본 편집]

불필요한 인덱스는 DROP INDEX 문을 사용하여 제거할 수 있으며, 다음과 같은 경우 인덱스를 제거한다.

  • 조회 빈도가 낮고 DML 작업이 많은 경우
  • 다른 인덱스와 기능이 중복되는 경우
  • 성능 모니터링 결과 비용만 증가시키는 경우

예: DROP INDEX idx_employee_name ON employees;

7 인덱스가 사용되는 쿼리 예시[편집 | 원본 편집]

  • 단일 컬럼 인덱스를 활용한 예
 SELECT * FROM employees WHERE name = '홍길동';
  • 복합 인덱스를 활용한 예
 SELECT * FROM employees WHERE department_id = 10 AND salary > 5000;
  • LIKE 연산에 대한 인덱스 사용 (전방 일치의 경우에만)
 SELECT * FROM employees WHERE name LIKE '김%';
  • 함수 기반 인덱스가 필요한 예
 SELECT * FROM employees WHERE UPPER(name) = '홍길동';
 -- 위 쿼리는 일반 인덱스를 사용하지 못하므로, 다음과 같이 인덱스를 생성해야 한다.
 CREATE INDEX idx_upper_name ON employees(UPPER(name));

8 주의사항[편집 | 원본 편집]

  • 너무 많은 인덱스는 삽입, 갱신, 삭제 시 부하를 증가시킨다.
  • 넓은 범위를 조회하는 쿼리에는 인덱스 효율이 낮을 수 있다.
  • 함수나 연산이 적용된 컬럼에는 일반 인덱스가 작동하지 않을 수 있다.

9 같이 보기[편집 | 원본 편집]

10 참고 문헌[편집 | 원본 편집]

  • Surajit Chaudhuri and Gerhard Weikum, "Rethinking Database System Architecture: Towards a Self-tuning RISC-style Database System", VLDB, 2000.
  • Thomas Connolly and Carolyn Begg, *Database Systems: A Practical Approach to Design, Implementation, and Management*, Pearson.

11 각주[편집 | 원본 편집]